import java.util.ArrayList;
import java.util.Scanner;

public class StudentSystem {
    public static void startStudentSystem() {
        ArrayList<Student> list = new ArrayList<>();
        //需求:
        //采取控制台的方式去书写学生管理系统
        //初始菜单：
        //"-------------欢迎来到学生管理系统-------------"
        //"1.添加学生"
        //"2.删除学生"
        //"3.修改学生"
        //"4.查询学生"
        //"5.退出"
        //"请输入你的选择："
        //学生类：
        //属性：id，姓名，年龄，家庭住址
        //1.添加功能：
        //键盘录入每一个学生信息并添加，需满足id唯一
        //2.删除功能：
        //键盘录入要删除的学生id
        //id存在则删除，不存在提示不存在，并返回到初始菜单
        //3.修改功能：
        //键盘录入学生id，需满足
        //id存在则继续录入其他信息，不存在提示不存在，并返回到初始菜单
        //4.查询功能
        //打印所有学生信息，需满足
        //如果没有学生信息，提示当前无该学生信息，请添加后查询
        //如果有学生信息，需按照一下格式输出
        //id        姓名      年龄      家庭住址

        //【1】创建主界面
        loop:    while (true) {
        System.out.println("-------------欢迎来到学生管理系统-------------");
        System.out.println("-                1.添加学生               -");
        System.out.println("-                2.删除学生               -");
        System.out.println("-                3.修改学生               -");
        System.out.println("-                4.查询学生               -");
        System.out.println("----------------- 5.退出 ------------------");
        System.out.println("请输入您的选择：");

        Scanner sc = new Scanner(System.in);
        String choice = sc.next();

        //如果是在这创建集合，那么每一次循环集合会更着更新循环，导致如果查询会一直显示没有
        switch (choice){
             case "1":
                 AddStudent(list);
                 break;
             case "2":
                 DeleteStudent(list);
                 break;
             case "3":
                 ChangeStudent(list);
                 break;
             case "4":
                 FindStudent(list);
                 break;
             case "5":
                 System.out.println("5.退出");
                 break loop;
                 //System.exit(0);//停止虚拟机运行
             default:
             System.out.println("没有这个选项");
                    }
                }

        //【2】
    }


    //——————————————————————————————————————————————
    //方法一：添加学生
    //键盘录入每一个学生信息并添加，需满足id唯一
    public static void AddStudent(ArrayList<Student> list) {
        Scanner sc = new Scanner(System.in);

        String id;
        while (true) {
            System.out.println("请输入学生id：");
            id = sc.next();
            boolean flag = contains(list,id);
            if (flag){
                System.out.println("当前id已经存在，需重新输入：");
            }else {
                break;
            }
        }

        System.out.println("请输入学生姓名：");
        String name = sc.next();
        System.out.println("请输入学生年龄：");
        int age = sc.nextInt();
        System.out.println("请输入学生家庭住址：");
        String address = sc.next();

        //创建一个学生对象，存入添加的元素
        Student s = new Student(id,name,age,address);
        //把学生对象添加到集合中
        list.add(s);
        System.out.println("学生信息添加成功");
    }

    //方法二：删除学生
    //键盘录入要删除的学生id
    //id存在则删除，不存在提示不存在，并返回到初始菜单
    public static void DeleteStudent(ArrayList<Student> list) {
        //先通过遍历得到集合里面的学生id
        //再进行判断比较
        //存在则删除，反之提示不存在并返回初始菜单
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要删除的id：");
        String id = sc.next();

        //查询id在集合中的索引
        int index = getIndex(list,id);

        //针对于id进行是否可删除的判断
        if (index >= 0){
            list.remove(index);
            System.out.println("id为：" + id + "的学生删除成功");
        }else {
            System.out.println("id不存在，删除失败");
        }
    }

    //方法三：修改学生
    //键盘录入学生id，需满足
    //id存在则继续录入其他信息，不存在提示不存在，并返回到初始菜单
    public static void ChangeStudent(ArrayList<Student> list) {
        //先键盘录入id
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要修改的学生id：");
        String id = sc.next();

        int index = getIndex(list,id);

        if (index == -1){
            System.out.println("要修改的id" + id + "不存在，请重新输入：");
            return;
        }

        //当代码执行到这里，说明id是存在的
        //获取要修改的学生对象
        Student stu = list.get(index);

        //输入其他信息并修改
        System.out.println("请输入要修改的学生姓名：");
        String newName = sc.next();
        stu.setName(newName);

        System.out.println("请输入要修改的学生年龄：");
        String newAge = sc.next();
        stu.setName(newAge);

        System.out.println("请输入要修改的学生家庭地址：");
        String newAddress = sc.next();
        stu.setName(newAddress);

        System.out.println("学生信息修改成功");
    }

    //方法四：查询学生
    //打印所有学生信息，需满足
    //如果没有学生信息，提示当前无该学生信息，请添加后查询
    //如果有学生信息，需按照一下格式输出
    //id        姓名      年龄      家庭住址
    public static void FindStudent(ArrayList<Student> list) {
        if (list.size() == 0){
            System.out.println("当前无学生信息，请添加后再查询");
            return;
        }
        //如果有学生信息则代码在这执行
        System.out.println("id\t姓名\t年龄\t家庭住址");
        for (int i = 0; i < list.size(); i++) {
            Student stu = list.get(i);
            System.out.println(stu.getId() + "\t" +stu.getName() + "\t" + stu.getAge() + "\t" + stu.getAddress());
        }
    }

    //方法五：判断id在集合中是否存在
    //判断id在集合中是否存在
    //需要对应集合，以及录入的id
    //boolean返回类型
    public static boolean contains(ArrayList<Student> list,String id) {
        //先遍历集合，得到里面每一个学生对象
        //拿到对象后，获取id进行判断
        //存在返回true，反之false
//        for (int i = 0; i < list.size(); i++) {
//            Student stu = list.get(i);
//            String sid = stu.getId();
//
//            if (sid.equals(id)){
//                return true;
//            }
//        }
//        return false;
        return getIndex(list,id) >= 0;
    }

    //方法六：通过id获取索引
    public static int getIndex(ArrayList<Student> list,String id) {
        for (int i = 0; i < list.size(); i++) {
            //得到每一个学生对象
            Student stu = list.get(i);
            //得到每一个学生对象的id
            String sid = stu.getId();
            if (sid.equals(id)){
                return i;
            }
        }
        return -1;
    }
}
